﻿using ExcellentProjectPlus.Dominio.Cuestionarios.Entidades;
using ExcellentProjectPlus.Dominio.Cuestionarios.Servicios.Recursos;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Transactions;

namespace ExcellentProjectPlus.Aplicacion.Cuestionarios.Recursos
{
    public class ServicioDeGestionDeRecursos : IServicioDeGestionDeRecursos
    {
        #region Propiedades
        IServicioDeAdministracionDeRecursos _servicioDeAdministracionDeRecursos;
        #endregion

        #region Constructores
        public ServicioDeGestionDeRecursos(IServicioDeAdministracionDeRecursos servicioDeAdministracionDeRecursos)
        {
            _servicioDeAdministracionDeRecursos = servicioDeAdministracionDeRecursos;
        }
        #endregion
        public IEnumerable<Recurso> ObtenerRecursos()
        {
            IEnumerable<Recurso> resultado = null;
            var trxOptions = new TransactionOptions();
            //Lectura con nivel de aislamiento ReadUncommited para evitar bloqueos en la base
            trxOptions.IsolationLevel = IsolationLevel.ReadUncommitted;
            trxOptions.Timeout = TimeSpan.FromMinutes(2);
            using (var transaccion = new TransactionScope(TransactionScopeOption.RequiresNew, trxOptions))
            {
                resultado = _servicioDeAdministracionDeRecursos.ObtenerRecursos();
                transaccion.Complete();
            }

            return resultado;
        }

        public Recurso ObtenerRecursoPorId(int id)
        {
            Recurso resultado = null;
            var trxOptions = new TransactionOptions();
            //Lectura con nivel de aislamiento ReadUncommited para evitar bloqueos en la base
            trxOptions.IsolationLevel = IsolationLevel.ReadCommitted;
            trxOptions.Timeout = TimeSpan.FromMinutes(2);
            using (var transaccion = new TransactionScope(TransactionScopeOption.RequiresNew, trxOptions))
            {
                resultado = _servicioDeAdministracionDeRecursos.ObtenerRecursoPorId(id);
                transaccion.Complete();
            }

            return resultado;
        }

        public void AgregarRecurso(Recurso recurso)
        {
            _servicioDeAdministracionDeRecursos.AgregarRecurso(recurso);
        }

        public void ModificarRecurso(Recurso recurso)
        {
            _servicioDeAdministracionDeRecursos.ModificarRecurso(recurso);
        }

        public void EliminarRecurso(Recurso recurso)
        {
            _servicioDeAdministracionDeRecursos.EliminarRecurso(recurso);
        }
    }
}
